{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from __future__ import absolute_import, division, print_function, unicode_literals\n",
    "\n",
    "import tensorflow as tf\n",
    "\n",
    "from tensorflow.keras.layers import Dense, Flatten, Conv2D, BatchNormalization, Dropout\n",
    "from tensorflow.keras import Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "config = tf.compat.v1.ConfigProto()\n",
    "config.gpu_options.allow_growth = True\n",
    "sess = tf.compat.v1.Session(config=config)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "test_data = pd.read_csv('test.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pixel0</th>\n",
       "      <th>pixel1</th>\n",
       "      <th>pixel2</th>\n",
       "      <th>pixel3</th>\n",
       "      <th>pixel4</th>\n",
       "      <th>pixel5</th>\n",
       "      <th>pixel6</th>\n",
       "      <th>pixel7</th>\n",
       "      <th>pixel8</th>\n",
       "      <th>pixel9</th>\n",
       "      <th>...</th>\n",
       "      <th>pixel774</th>\n",
       "      <th>pixel775</th>\n",
       "      <th>pixel776</th>\n",
       "      <th>pixel777</th>\n",
       "      <th>pixel778</th>\n",
       "      <th>pixel779</th>\n",
       "      <th>pixel780</th>\n",
       "      <th>pixel781</th>\n",
       "      <th>pixel782</th>\n",
       "      <th>pixel783</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 784 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   pixel0  pixel1  pixel2  pixel3  pixel4  pixel5  pixel6  pixel7  pixel8  \\\n",
       "0       0       0       0       0       0       0       0       0       0   \n",
       "1       0       0       0       0       0       0       0       0       0   \n",
       "2       0       0       0       0       0       0       0       0       0   \n",
       "3       0       0       0       0       0       0       0       0       0   \n",
       "4       0       0       0       0       0       0       0       0       0   \n",
       "\n",
       "   pixel9  ...  pixel774  pixel775  pixel776  pixel777  pixel778  pixel779  \\\n",
       "0       0  ...         0         0         0         0         0         0   \n",
       "1       0  ...         0         0         0         0         0         0   \n",
       "2       0  ...         0         0         0         0         0         0   \n",
       "3       0  ...         0         0         0         0         0         0   \n",
       "4       0  ...         0         0         0         0         0         0   \n",
       "\n",
       "   pixel780  pixel781  pixel782  pixel783  \n",
       "0         0         0         0         0  \n",
       "1         0         0         0         0  \n",
       "2         0         0         0         0  \n",
       "3         0         0         0         0  \n",
       "4         0         0         0         0  \n",
       "\n",
       "[5 rows x 784 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_predit = np.array(test_data / 255).reshape(28000, 28, 28, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "class MyModel(Model):\n",
    "  def __init__(self):\n",
    "    super(MyModel, self).__init__()\n",
    "    self.conv1 = Conv2D(32,kernel_size=3,activation='relu',input_shape=(28,28,1))\n",
    "    self.bn1 = BatchNormalization()\n",
    "    self.conv2 = Conv2D(32,kernel_size=3,activation='relu')\n",
    "    self.bn2 = BatchNormalization()\n",
    "    self.conv3 = Conv2D(32,kernel_size=5,strides=2,padding='same',activation='relu')\n",
    "    self.bn3 = BatchNormalization()\n",
    "    self.drop1 = Dropout(0.5)\n",
    "    \n",
    "    self.conv4 = Conv2D(64,kernel_size=3,activation='relu')\n",
    "    self.bn4 = BatchNormalization()\n",
    "    self.conv5 = Conv2D(64,kernel_size=3,activation='relu')\n",
    "    self.bn5 = BatchNormalization()\n",
    "    self.conv6 = Conv2D(64,kernel_size=5,strides=2,padding='same',activation='relu')\n",
    "    self.bn6 = BatchNormalization()\n",
    "    self.drop2 = Dropout(0.5)\n",
    "    \n",
    "    self.flatten = Flatten()\n",
    "    self.d1 = Dense(128, activation='relu')\n",
    "    self.bn7 = BatchNormalization()\n",
    "    self.drop3 = Dropout(0.5)\n",
    "    self.d2 = Dense(10, activation='softmax')\n",
    "\n",
    "  def call(self, x):\n",
    "    x = self.conv1(x)\n",
    "    x = self.bn1(x)\n",
    "    x = self.conv2(x)\n",
    "    x = self.bn2(x)\n",
    "    x = self.conv3(x)\n",
    "    x = self.bn3(x)\n",
    "    x = self.drop1(x)\n",
    "    \n",
    "    x = self.conv4(x)\n",
    "    x = self.bn4(x)\n",
    "    x = self.conv5(x)\n",
    "    x = self.bn5(x)\n",
    "    x = self.conv6(x)\n",
    "    x = self.bn6(x)\n",
    "    x = self.drop2(x)\n",
    "    \n",
    "    x = self.flatten(x)\n",
    "    x = self.d1(x)\n",
    "    x = self.bn7(x)\n",
    "    x = self.drop3(x)\n",
    "    return self.d2(x)\n",
    "\n",
    "# Create an instance of the model\n",
    "model = MyModel()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.training.tracking.util.CheckpointLoadStatus at 0x7f07201c3a58>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.load_weights('myweight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "@tf.function\n",
    "def test_step(images):\n",
    "  return model(images)\n",
    "  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "\n",
    "plt.imshow(X_predit[27998].reshape((28, 28)))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "result = []\n",
    "for image in X_predit:\n",
    "#     print(np.shape(image))\n",
    "    prediction = model(image.reshape((1, 28, 28, 1)))\n",
    "    result.append(np.argmax(prediction))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "# # ENSEMBLE PREDICTIONS AND SUBMIT\n",
    "# results = np.zeros( (X_test.shape[0],10) ) \n",
    "# for j in range(nets):\n",
    "#     results = results + model[j].predict(X_test)\n",
    "# results = np.argmax(results,axis = 1)\n",
    "results = np.array(result)\n",
    "results = pd.Series(results,name=\"Label\")\n",
    "submission = pd.concat([pd.Series(range(1,28001),name = \"ImageId\"),results],axis = 1)\n",
    "submission.to_csv(\"submission.csv\",index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
